/*
@Author   : Uyynot
@Email    : uyynot@qq.com
@Time     : 2023/10/18 16:32
@File     : http.go
@Project  : GoProject
@Desc     :
*/
package http

import (
	"context"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func Run(r *gin.Engine, addr string) {
	srv := &http.Server{Addr: addr, Handler: r}

	//在goroutine中初始化服务器，这样它不会阻塞下面的优雅关闭处理
	go func() {
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen:%s\n", err)
		}
	}()

	//等待中断信号以5秒超时时间优雅地关闭服务器。
	quit := make(chan os.Signal, 1)
	// kill 没有参数时默认发送 syscall.SIGTERM 信号
	// kill -2 对应 syscall.SIGINT 信号
	// kill -9 对应 syscall.SIGKILL 信号，但无法捕获，因此不需要添加

	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit

	//该上下文用于通知服务器，它有5秒钟的时间来完成它目前正在处理的请求
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server forced to shutdown: ", err)
	}

	log.Println("Server exiting")

}
